package com.charon.auth.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;

/**
  *@ClassName: CharonUserDetailsService
  *@Description: 自定义UserDetails。
  *     注意：如果没有自定义实现UserDetailService接口的类，并且将该类声明为一个Bean，
 *          那么Security将会自动生成一个账户名为user，密码会在控制台打印出来，登录时可以使用该密码，
 *          注意，使用生成的密码的时候在配置了自定义的表单登陆界面时，不要配置加密方式，不然会密码错误。
  *@Author: Charon [248135724@qq.com]
  *@Date: 2019/1/17 0017 12:01
  *@Version: 1.0
  */
@Slf4j
@Component
public class CharonUserDetailsService  implements UserDetailsService {

    @Autowired
    private PasswordEncoder passwordEncoder;

    /**
     * UserDetails接口中有四个方法；返回false将抛出异常。
     * 1、isAccountNonExpired();账户是否过期，如果项目需求不需要过期，则返回true就可以。
     * 2、isAccountNonLocked();账户是否锁定。
     * 3、isCredentialsNonExpired();密码是否过期，如果项目需求不需要过期，则返回true就可以。
     * 4、isEnabled();账户是否可用。
     */
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        //根据用户名去数据库查询用户信息，封装到User对象中。
        //返回的User对象为Security中的内置User对象。第三个参数为验证的权限，应该是一个集合对象，下面方式是将一个字符串转化为 。
        //return new User(username,"123456",AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));

        log.info("登陆认证：CharonUserDetailsService："+username);
        //加密密码
        String password="123456";
        String encode = passwordEncoder.encode(password);
        log.info("登陆认证：加密后的登陆密码："+encode);
        return new User(username,encode,AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
        //下面的boolean，看UserDetails接口中有四个方法
        //return new User(username,encode,true,true,true,false,AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
    }
}
